/**
 * 数据校验工具
 * 提供常用的数据类型检查和验证函数
 */

/**
 * 确保数据是数组类型
 * @param {any} data - 要检查的数据
 * @param {Array} defaultValue - 默认值，当数据不是数组时返回
 * @returns {Array} - 确保是数组的数据
 */
export function ensureArray(data, defaultValue = []) {
  return Array.isArray(data) ? data : defaultValue
}

/**
 * 确保数据是对象类型
 * @param {any} data - 要检查的数据
 * @param {Object} defaultValue - 默认值，当数据不是对象时返回
 * @returns {Object} - 确保是对象的数据
 */
export function ensureObject(data, defaultValue = {}) {
  return data && typeof data === 'object' && !Array.isArray(data) ? data : defaultValue
}

/**
 * 确保数据是字符串类型
 * @param {any} data - 要检查的数据
 * @param {string} defaultValue - 默认值，当数据不是字符串时返回
 * @returns {string} - 确保是字符串的数据
 */
export function ensureString(data, defaultValue = '') {
  return typeof data === 'string' ? data : defaultValue
}

/**
 * 确保数据是数字类型
 * @param {any} data - 要检查的数据
 * @param {number} defaultValue - 默认值，当数据不是数字时返回
 * @returns {number} - 确保是数字的数据
 */
export function ensureNumber(data, defaultValue = 0) {
  return typeof data === 'number' && !isNaN(data) ? data : defaultValue
}

/**
 * 确保数据是布尔类型
 * @param {any} data - 要检查的数据
 * @param {boolean} defaultValue - 默认值，当数据不是布尔值时返回
 * @returns {boolean} - 确保是布尔值的数据
 */
export function ensureBoolean(data, defaultValue = false) {
  return typeof data === 'boolean' ? data : defaultValue
}

/**
 * 检查对象是否有指定的属性
 * @param {Object} obj - 要检查的对象
 * @param {string} prop - 属性名
 * @returns {boolean} - 对象是否有指定属性
 */
export function hasProperty(obj, prop) {
  return obj && typeof obj === 'object' && Object.prototype.hasOwnProperty.call(obj, prop)
}

/**
 * 安全获取对象的嵌套属性值
 * @param {Object} obj - 对象
 * @param {string} path - 属性路径，如 'user.profile.name'
 * @param {any} defaultValue - 默认值，当属性不存在时返回
 * @returns {any} - 属性值或默认值
 */
export function getNestedValue(obj, path, defaultValue = undefined) {
  if (!obj || typeof obj !== 'object') return defaultValue
  
  const keys = path.split('.')
  let result = obj
  
  for (const key of keys) {
    if (result === null || result === undefined || typeof result !== 'object') {
      return defaultValue
    }
    result = result[key]
  }
  
  return result === undefined ? defaultValue : result
}

/**
 * 验证邮箱格式
 * @param {string} email - 邮箱地址
 * @returns {boolean} - 是否是有效的邮箱地址
 */
export function isValidEmail(email) {
  const re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
  return re.test(email)
}

/**
 * 验证手机号格式（中国大陆）
 * @param {string} phone - 手机号
 * @returns {boolean} - 是否是有效的手机号
 */
export function isValidPhone(phone) {
  const re = /^1[3-9]\d{9}$/
  return re.test(phone)
}

/**
 * 验证身份证号格式（中国大陆）
 * @param {string} idCard - 身份证号
 * @returns {boolean} - 是否是有效的身份证号
 */
export function isValidIdCard(idCard) {
  const re = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  return re.test(idCard)
} 